package com.product.android.business.switchUser;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;

import com.common.android.utils.concurrent.NdCacheAsyncTask;

/**
 * 管理切换账号后，相关界面重新刷新的类
 * 
 * @author lfa
 * @Date 2013 2013-12-19 下午2:46:28
 */
public enum SwitchUserReloadManager {
	INSTANCE;

	private static final boolean DEFAULT_RELOAD_VALUE = true;

	/*
	 * 表示主界面各个tab页的枚举类型
	 */
	public enum TabIdentifier {
		TAB_CHAT, // 聊天
		TAB_ME, // 我
		TAB_SNS, // 朋友圈
		TAB_WATER_FALL, // 照片墙
		TAB_MORE; // 更多
	}

	private SwitchUserReloadManager() {
		setAllReloadFlag();
	}

	// value的值为true时，表示key所代表的页面在执行onResume时需要整个页面重新刷新
	private Map<TabIdentifier, Boolean> mTabReloadData = new HashMap<TabIdentifier, Boolean>();

	/*
	 * 把主界面所有tab页的刷新标志位都设为需要刷新，在切换身份或账号成功时调用
	 * 
	 * @annotate NotThreadSafe
	 */
	public void setAllReloadFlag() {
		TabIdentifier[] array = TabIdentifier.values();
		for (TabIdentifier item : array) {
			mTabReloadData.put(item, DEFAULT_RELOAD_VALUE);
		}
	}

	/*
	 * 对id所表示的界面设置刷新标志位，只应在切换身份或账号的时候把标志位设置为true
	 * 
	 * @annotate NotThreadSafe
	 */
	public void setReloadFlag(TabIdentifier id, boolean reload) {
		mTabReloadData.put(id, reload);
	}

	/*
	 * 返回true表示id所对应的界面需要重新刷新
	 * 
	 * @annotate NotThreadSafe
	 */
	public boolean needReload(TabIdentifier id) {
		Boolean result = mTabReloadData.get(id);
		if (result == null) {
			mTabReloadData.put(id, DEFAULT_RELOAD_VALUE);
			return DEFAULT_RELOAD_VALUE;
		} else {
			return result;
		}
	}

        // 主界面的tab页，在恢复可见时检测是否需要重新刷新跟用户相关的界面控件
	public static void tabActivityCheckUserSwitch(Activity activity,
			TabUIRefresh refresh) {
		TabIdentifier id = refresh.getTabIdentifier();
		if (id != null) {
			if (SwitchUserReloadManager.INSTANCE.needReload(id)) { // 需要刷新
				refresh.clearOldAccountUI();
				new RefreshTask(activity).execute(refresh);
			}
		}
	}

	// 切换账号后用于重新加载数据及刷新界面
	private static class RefreshTask extends
			NdCacheAsyncTask<TabUIRefresh, Void, TabUIRefresh> {

		private final SoftReference<Activity> mRef;

		public RefreshTask(Activity activity) {
			mRef = new SoftReference<Activity>(activity);
		}

		@Override
		protected TabUIRefresh doInBackground(TabUIRefresh... params) {
			TabUIRefresh refresh = params[0];
			refresh.loadDataToMemory(); // 加载数据到内存
			return refresh;
		}

		@Override
		protected void onPostExecute(TabUIRefresh result) {
			SwitchUserReloadManager.INSTANCE.setReloadFlag(
					result.getTabIdentifier(), false); // 清除刷新标志位
			if (mRef == null) {
				return;
			}
			Activity activity = mRef.get();
			if (activity == null) {
				return;
			}
			if (activity.isFinishing()) {
				return;
			}
			result.refreshWhenSwitchUser(); // 刷新界面
		}

	}
}
